package br.com.vpsa.previdordevendas.model.service.impl;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import br.com.vpsa.previdordevendas.model.entity.FaturamentoMensal;
import br.com.vpsa.previdordevendas.model.pojo.FaturamentoAnual;
import br.com.vpsa.previdordevendas.model.service.FaturamentoMensalService;
import br.com.vpsa.previdordevendas.model.service.HistoricoFaturamentoService;
import br.com.vpsa.previdordevendas.model.util.CalendarUtils;
import br.com.vpsa.previdordevendas.model.util.MoedaUtil;

@Service
public class HistoricoFaturamentoServiceImpl implements HistoricoFaturamentoService{

	@Autowired
	private FaturamentoMensalService faturamentoMensalService;
	
    @PersistenceContext
    private EntityManager em;
	
	@Override
	public List<FaturamentoAnual> gerarHistoricoAnual(String base, long idEntidade) 
	{
		List<FaturamentoAnual> faturamentosAnuais = new ArrayList<FaturamentoAnual>();
		List<FaturamentoMensal> pedidosMensais = faturamentoMensalService.listarFaturamentosMensais(base, idEntidade);
		
		int anoAtual = CalendarUtils.getAnoAtual();
		
		for( int ano = anoAtual - CalendarUtils.ANOS_PASSADOS ; ano <= anoAtual ; ano++ )
		{
			FaturamentoAnual faturamentoAnual = new FaturamentoAnual();
			faturamentoAnual.setAno(ano);
			faturamentoAnual.setJaneiro(getValor(pedidosMensais,ano, Calendar.JANUARY));
			faturamentoAnual.setFevereiro(getValor(pedidosMensais,ano, Calendar.FEBRUARY));
			faturamentoAnual.setMarco(getValor(pedidosMensais,ano, Calendar.MARCH));
			faturamentoAnual.setAbril(getValor(pedidosMensais,ano, Calendar.APRIL));
			faturamentoAnual.setMaio(getValor(pedidosMensais,ano, Calendar.MAY));
			faturamentoAnual.setJunho(getValor(pedidosMensais,ano, Calendar.JUNE));
			faturamentoAnual.setJulho(getValor(pedidosMensais,ano, Calendar.JULY));
			faturamentoAnual.setAgosto(getValor(pedidosMensais,ano, Calendar.AUGUST));
			faturamentoAnual.setSetembro(getValor(pedidosMensais,ano, Calendar.SEPTEMBER));
			faturamentoAnual.setOutubro(getValor(pedidosMensais,ano, Calendar.OCTOBER));
			faturamentoAnual.setNovembro(getValor(pedidosMensais,ano, Calendar.NOVEMBER));
			faturamentoAnual.setDezembro(getValor(pedidosMensais,ano, Calendar.DECEMBER));
			
			faturamentosAnuais.add(faturamentoAnual);
		}
		
		return faturamentosAnuais;
	}
	
	private String getValor( List<FaturamentoMensal> pedidosMensais, int ano, int mes )
	{
		FaturamentoMensal faturamentoMensal = FaturamentoMensal.find(pedidosMensais, ano, mes);

		String result = null;
		
		if( faturamentoMensal != null ){
			result = MoedaUtil.convert( faturamentoMensal.getValorTotal() );
		}
		
		return result;
	}

	@Override
	@Transactional
	public void salvarHistorico(String base, Long idEntidade, List<FaturamentoAnual> faturamentosAnuais) 
	{
		faturamentoMensalService.apagarFaturamentosMensais(base, idEntidade);
		
		for( FaturamentoAnual faturamentoAnual : faturamentosAnuais )
		{
			int mes = 0;
			
			for( BigDecimal valor : faturamentoAnual.getFaturamentoMensal() )
			{
				FaturamentoMensal faturamentoMensal = new FaturamentoMensal(idEntidade, faturamentoAnual.getAno(), mes++, valor, base );

				if( valor != null ){
					em.persist(faturamentoMensal);
				}
			}
		}
	}

}
